#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

// 定义双向链表中节点的结构
// 当链表中只有哨兵位节点的时候，我们称该链表为空链表
// 即哨兵位是不能删除的

typedef int LTDataType;
typedef struct ListNode
{
	LTDataType data;
	struct ListNode* prev;
	struct ListNode* next;
}LTNode;

// 双向链表是带有哨兵位的，插入数据之前链表中必须要先初始化一个哨兵位
// void LTInit(LTNode** pphead);
LTNode* LTInit();

// 不需要改变哨兵位，则不需要传递二级指针
// 如果需要修改哨兵位的话，则传二级指针
void LTPushBack(LTNode* phead, LTDataType x);
void LTPushFront(LTNode* phead, LTDataType x);

void LTPrint(LTNode* phead);

void LTPopBack(LTNode* phead);
void LTPopFront(LTNode* phead);

LTNode* LTFind(LTNode* phead, LTDataType x);

void LTInsert(LTNode* pos, LTDataType x);
void LTErase(LTNode* pos);

// 传一级指针，保持接口一致性
// 但是带头结点不会被置为空
void LTDesTroy(LTNode* phead);